use crate::json_basic::JsonNode;

mod json_lexer;
mod json_token;
mod json_parser;
mod json_basic;
mod json_dumper;
mod json_iterator;
mod json_exchang;
mod json_next;

pub fn parse_json(input: &str) -> Option<JsonNode> {
    let list = json_lexer::parse_all(input)?;
    println!("list: {:?}",list);
    json_parser::parse_all(list)
}

fn main() {
    let json_str = "{\"first name\":\"Yiran\", \"last name\": \"王\", \"age\":20,\"is_student\":true,\"courses\":[{\"name\":\"CPEN 212\",\"credits\":4},{\"name\":\"CPSC 221\",\"credits\":4},{\"name\":\"Math 256\",\"credits\":3}],\"address\":{\"street\":\"1935 Lower Mall\",\"city\":\"Vancouver\",\"postal_code\":\"V6T 1X1\"},\"friends\":[{\"name\":\"Tommy\",\"age\":20},{\"name\":\"Joe\",\"age\":20}],\"graduated\":false, \"university\": \"UBC\"}";

    let mut json1 = parse_json(json_str).unwrap();

    // json1["courses"].push(parse_json("{\"name\":\"ELEC 201\",\"credits\":4}").unwrap());
    // json1["courses"].push(parse_json("{\"name\":\"BIOL 112\",\"credits\":3}").unwrap());
    //
    // json1["message"] = JsonNode::Array(vec![
    //     JsonNode::String("早上好中国！".to_string()),
    //     JsonNode::String("现在我有冰淇淋，".to_string()),
    //     JsonNode::String("我很喜欢冰淇淋。".to_string()),
    // ]);

    println!("{}",json1.dump(2, true));
    // println!("json1: {}",json1);

    // let mut json2 = parse_json(&json1.dump(2, true)).unwrap();
    // assert_eq!(json2, json1);
    // println!("{}", json2.dump(2, false));
    // println!("json2: {}", json2.dump(2, false));

    // println!("json1: {}", parse_json(&json1.dump(2, true)).unwrap().dump(2, false));
    // println!("json1: {:?}", json1.dump(2, true));
    // println!("json1.dump: {:?}", json1.dump(2, false));
    // println!("parse_json: {:?}", parse_json(&json1.dump(2, true)));

    //
    // json2.obj_iter().unwrap().for_each(|(key,value)|{
    //     println!("key: {:?}, value: {:?}", key, value);
    // });
    //
    // json2.obj_iter_mut().unwrap().for_each(|(key,value)|{
    //     *value = JsonNode::String("test".parse().unwrap());
    //     println!("key: {:?}, value: {:?}", key, value);
    // });

    // json2.obj_into_iter().unwrap().for_each(|(key,value)|{
    //     // println!("key: {:?}, value: {:?}", key, value);
    //     match value {
    //         JsonNode::Array(t) => {
    //             println!("t: {:?}", t);
    //         }
    //         _ => ()
    //     }
    // });
}
